package com.wwg.aspect;

import java.lang.annotation.*;

/**
 *类描述:同步锁
 *
 *@Author:武晓波
 *@date:2019年5月8日
 *@Version:2.1
 */
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface DistLock {

	/**  
	 * @return  
	 * @功能描述:锁的key redis key的组合规则为 "RedisSyn_" + synKey + @DistLockKey（非必填）
	 * @Author:武晓波
	 * @date:2019年5月8日  下午5:38:10
	 * @Version:2.1 
	 */
	String synKey();
	
	/**  
	 * @return  
	 * @功能描述:是否等待，默认直接放弃
	 * @Author:武晓波
	 * @date:2019年4月9日  上午10:13:02
	 * @Version:2.1 
	 */
	boolean isWait() default false;

	/**  
	 * @return  
	 * @功能描述:持锁时间，超时时间，持锁超过此时间自动丢弃锁 单位毫秒,默认3秒
	 *         如果为0表示永远不释放锁
	 * @Author:武晓波
	 * @date:2019年5月8日  下午5:44:35
	 * @Version:2.1  
	 */
	long keepMills() default 3 * 1000;

	/**  
	 * @return  
	 * @功能描述:当获取锁失败，是继续等待还是放弃，默认为继续等待
	 * @Author:武晓波
	 * @date:2019年5月9日  下午1:37:45
	 * @Version:2.1 
	 */
	boolean toWait() default true;

	/**  
	 * @return  
	 * @功能描述:没有获取到锁的情况下且toWait()为继续等待，睡眠指定毫秒数继续获取锁，也就是轮询获取锁的时间，默认为10毫秒
	 * @Author:武晓波
	 * @date:2019年5月9日  下午1:38:01
	 * @Version:2.1
	 */
	long sleepMills() default 10;

	/**  
	 * @return  
	 * @功能描述:锁获取超时时间，没有获取到锁的情况下且toWait()为true继续等待，
	 * 		   如果超时抛出TimeoutException，单位毫秒,默认10秒，如果设置为0即为没有超时时间，一直获取下去；
	 * @Author:武晓波
	 * @date:2019年5月9日  下午1:35:55
	 * @Version:2.1 
	 */
	long maxSleepMills() default 10 * 1000;
}